import { BrowserWindow, ipcMain, screen, type IpcMainInvokeEvent } from 'electron'
import { join } from 'path'
import { is } from '@electron-toolkit/utils'

interface IContext {
  // 是否退出应用
  allowQuitting: boolean
  // 显示或隐藏窗口
  isShow: boolean
  // 创建窗口对象
  listWindow: BrowserWindow | null
}

// 子窗口状态对象
const context: IContext = {
  // 是否退出应用
  allowQuitting: false,
  // 显示或隐藏窗口
  isShow: false,
  // 创建窗口对象
  listWindow: null
}

// 显示窗口
const showWindow = (): void => {
  const listWindow = context.listWindow
  if (listWindow && !listWindow.isDestroyed()) {
    context.isShow = true
    listWindow.show()
  }
}

// 隐藏窗口
const hideWindow = (): void => {
  const listWindow = context.listWindow
  if (listWindow && !listWindow.isDestroyed()) {
    context.isShow = false
    listWindow.hide()
  }
}

// 创建子窗口
const createListWindow = (): void => {
  const newWindow = new BrowserWindow({
    width: 400,
    height: 100,
    show: false,
    // 无边框窗口
    frame: false,
    // 窗口大小是否可调整
    resizable: false,
    autoHideMenuBar: true,
    // 置顶窗口
    alwaysOnTop: true,
    // 透明窗口
    transparent: true,
    // 去除阴影
    hasShadow: false,
    webPreferences: {
      preload: join(__dirname, '../preload/index.js'),
      sandbox: false
    }
  })

  if (is.dev && process.env['ELECTRON_RENDERER_URL']) {
    newWindow.loadURL(process.env['ELECTRON_RENDERER_URL'] + '#/about')
  } else {
    newWindow.loadFile(join(__dirname, '../renderer/index.html'))
  }

  newWindow.on('ready-to-show', () => {
    const winHeight = screen.getPrimaryDisplay().bounds.height

    // 设置屏幕位置
    newWindow.setBounds({
      y: winHeight - 300
    })

    newWindow.show()
  })

  // 关闭事件
  newWindow.on('close', () => {
    // 如果此时,应用没有被退出,则终止默认行为,并且隐藏主窗口
    if (context.allowQuitting === false) {
      hideWindow()
    } else {
      context.listWindow = null
    }
  })

  context.listWindow = newWindow
  context.isShow = true
}

// 新建窗口
ipcMain.handle('new-list', () => {
  const listWindow = context.listWindow
  if (!listWindow) {
    createListWindow()
  } else {
    if (context.isShow) {
      hideWindow()
    } else {
      showWindow()
    }
  }
})

// 关闭窗口
ipcMain.handle('close-list', hideWindow)
